home *** CD-ROM | disk | FTP | other *** search
- /*
- FileList 1.4
- "Main.c"
- */
-
- #define GLOBALS
- #include "Main.h"
- #include "Utilities.h"
- #include "File.h"
- #include "Mouse.h"
- #include "Stack.h"
- #include "Search.h"
- #include "Window.h"
- #include "About.h"
- #include "Options.h"
- #include "Init.h"
-
- /* ----- Used by InitDialogs() ----------------------------------------- */
-
- pascal void Crash (void)
- {
- ExitToShell();
- }
-
- /* ----- Error message ------------------------------------------------- */
-
- void Message (
- register short n,
- register short code)
- {
- register StringHandle h;
- register DialogPtr dialogP;
- short item;
- unsigned char number[10];
-
- InitCursor();
- SysBeep(1);
- if (h = GetString(n)) {
- HLock(h);
- if (code)
- NumToString((long)code, number);
- else
- number[0] = 0;
- ParamText(*h, number, EmptyStr, EmptyStr);
- CenterDialog('DLOG', MessageDialog);
- if (dialogP = GetNewDialog(MessageDialog, 0L, -1L)) {
- ModalDialog(0L, &item);
- DisposDialog(dialogP);
- }
- HUnlock(h);
- }
- }
-
- /* ----- Save Alert ---------------------------------------------------- */
-
- Boolean SaveBefore (void)
- {
- register unsigned char *s;
-
- if (!Dirty)
- return TRUE;
- if (VrefNum)
- s = Fname;
- else
- s = *GetString(SAVENAME);
- ParamText(s, EmptyStr, EmptyStr, EmptyStr);
- CenterDialog('ALRT', SaveDialog);
- switch (CautionAlert(SaveDialog, 0L)) {
- case SaveOk:
- if (!DoSave(FALSE))
- return FALSE; /* Cancel */
- case SaveNo:
- return TRUE;
- }
- return FALSE; /* Cancel */
- }
-
- /* ----- Update menus -------------------------------------------------- */
-
- #define MS_WINDOW 0x0001 /* There is at least one window */
- #define MS_ACTIVE 0x0002 /* We are active */
- #define MS_DATA 0x0004 /* There is data */
- #define MS_DIRTY 0x0008 /* The data is dirty */
- #define MS_VOLUME 0x0010 /* A volume is selected */
- #define MS_SELECT 0x0020 /* A volume/file is selected */
- #define MS_AGAIN 0x0040 /* Find again is possible */
-
- static void EnableMenu (register MenuHandle mh, register short n)
- {
- while (n > 0) {
- EnableItem(mh, n);
- --n;
- }
- }
-
- static void DisableMenu (register MenuHandle mh, register short n)
- {
- while (n > 0) {
- DisableItem(mh, n);
- --n;
- }
- }
-
- static void UpdateMenus (register short options)
- {
- register WindowData *w;
- register short state;
-
- options &= optionKey;
- state = 0;
- if (w = (WindowDataPtr)FrontWindow()) {
- state |= MS_WINDOW;
- if (w == &FileData || w == &VolumeData) {
- state |= MS_ACTIVE;
- if (InfoSize) {
- state |= MS_DATA;
- if (Dirty)
- state |= MS_DIRTY;
- if (VolumeData.select != -1L && w == &VolumeData) {
- state |= MS_VOLUME;
- state |= MS_SELECT;
- } else
- if (FileData.select != -1L && w == &FileData)
- state |= MS_SELECT;
- if (w->find[0] || w->type || w->creator)
- state |= MS_AGAIN;
- }
- }
- }
-
- if (state & MS_WINDOW)
- if (state & MS_ACTIVE) { /* We are active */
- EnableItem(FileM, fOpen);
- DisableItem(EditM, eUndo);
- DisableItem(EditM, eCut);
- DisableItem(EditM, ePaste);
- EnableMenu(VolumeM, vItems);
- if (state & MS_DATA) { /* Data */
- if (options)
- EnableItem(EditM, eClear);
- else
- DisableItem(EditM, eClear);
- EnableItem(FileM, fNew);
- EnableItem(FileM, fSaveAs);
- EnableItem(FileM, fSaveText);
- EnableMenu(FileData.sortmenu, FSORT_MAX);
- EnableItem(EditM, eFind);
- if (state & MS_AGAIN)
- EnableItem(EditM, eAgain);
- else
- DisableItem(EditM, eAgain);
- EnableMenu(VolumeData.sortmenu, VSORT_MAX);
- if (state & MS_DIRTY)
- EnableItem(FileM, fSave);
- else
- DisableItem(FileM, fSave);
- if (state & MS_VOLUME) {
- EnableItem(VolumeM, vDelete);
- EnableItem(VolumeM, vRename);
- } else {
- DisableItem(VolumeM, vDelete);
- DisableItem(VolumeM, vRename);
- }
- if (state & MS_SELECT){
- EnableItem(EditM, eCopy);
- EnableItem(EditM, eSelection);
- } else {
- DisableItem(EditM, eCopy);
- DisableItem(EditM, eSelection);
- }
- } else { /* No data */
- DisableItem(FileM, fNew);
- DisableItem(FileM, fSave);
- DisableItem(FileM, fSaveAs);
- DisableItem(FileM, fSaveText);
- DisableItem(EditM, eCopy);
- DisableItem(EditM, eClear);
- DisableItem(EditM, eFind);
- DisableItem(EditM, eAgain);
- DisableItem(EditM, eSelection);
- DisableItem(VolumeM, vDelete);
- DisableItem(VolumeM, vRename);
- DisableMenu(FileData.sortmenu, FSORT_MAX);
- DisableMenu(VolumeData.sortmenu, VSORT_MAX);
- }
- } else { /* Desk accessory window */
- DisableItem(FileM, fNew);
- DisableItem(FileM, fOpen);
- DisableItem(FileM, fSave);
- DisableItem(FileM, fSaveAs);
- DisableItem(FileM, fSaveText);
- EnableItem(EditM, eUndo);
- EnableItem(EditM, eCut);
- EnableItem(EditM, eCopy);
- EnableItem(EditM, ePaste);
- EnableItem(EditM, eClear);
- DisableItem(EditM, eFind);
- DisableItem(EditM, eAgain);
- DisableItem(EditM, eSelection);
- DisableItem(VolumeM, 0);
- DisableMenu(FileData.sortmenu, FSORT_MAX);
- DisableMenu(VolumeData.sortmenu, VSORT_MAX);
- }
- else { /* No window */
- DisableItem(FileM, fNew);
- DisableItem(FileM, fOpen);
- DisableItem(FileM, fSave);
- DisableItem(FileM, fSaveAs);
- DisableItem(FileM, fSaveText);
- DisableMenu(EditM, eItems);
- DisableItem(VolumeM, vItems);
- DisableMenu(FileData.sortmenu, FSORT_MAX);
- DisableMenu(VolumeData.sortmenu, VSORT_MAX);
- }
- }
-
- /* ----- Close Window -------------------------------------------------- */
-
- void DoClose (register WindowPeek w)
- {
- register short k;
-
- if ((k = w->windowKind) < 0)
- CloseDeskAcc(k);
- else
- CloseWindow(w);
- }
-
- void DoClose1 (register WindowPtr w)
- {
- if (w == (WindowPtr)&FileData || w == (WindowPtr)&VolumeData)
- SendBehind(w, 0L);
- else
- DoClose((WindowPeek)w);
- }
-
- /* ----- Clear sorted by ----------------------------------------------- */
-
- void ClearSorted (register WindowDataPtr w)
- {
- if (w->sorted) {
- CheckItem(w->sortmenu, w->sorted, FALSE);
- w->sorted = 0;
- }
- }
-
- /* ----- Update window titles ------------------------------------------ */
-
- void NewTitle (register WindowDataPtr w)
- {
- register StringHandle h;
- unsigned char num[10];
- unsigned char t[256];
-
- if (h = GetString(w->title)) {
- BlockMove(*h, t, **h + 1L);
- NumToString(w->count, num);
- Append(t, SpStr);
- Append(t, num);
- SetWTitle(w, t);
- }
- }
-
- /* ----- Update -------------------------------------------------------- */
-
- static void UpdateW (register WindowDataPtr w)
- {
- SetPort(w);
- AdjustScrollBar(w);
- SetCtlValue(w->vs, w->count - 1); /* Scroll to end */
- InvalRect(&((WindowPtr)w)->portRect);
- NewTitle(w);
- }
-
- void Update (void)
- {
- UpdateW(&VolumeData);
- UpdateW(&FileData);
- }
-
- /* ----- Handle disk inserted event ------------------------------------ */
-
- static void DoDisk (unsigned long message)
- {
- register short err;
-
- if (err = SearchVol((short)(message & 0x0000FFFF), TRUE))
- Message(err, 0);
- Update();
- ClearSorted(&FileData);
- ClearSorted(&VolumeData);
- Dirty = TRUE;
- }
-
- /* ----- Sort window --------------------------------------------------- */
-
- static void DoSort (
- register WindowDataPtr w,
- short item)
- {
- register short i;
-
- if (item < 1 || item > w->maxsort)
- return;
- SetWatch();
- w->sorted = item;
- if (w->select != -1L)
- Select(w, w->select, FALSE);
- (*(w->sort))(item - 1);
- for (i = 1; i <= w->maxsort; i++)
- CheckItem(w->sortmenu, i, i == item);
- SetPort(w);
- AdjustScrollBar(w);
- InvalRect(&((WindowPtr)w)->portRect);
- Dirty = TRUE;
- InitCursor();
- }
-
- /* ----- Quit ---------------------------------------------------------- */
-
- void DoQuit (void)
- {
- DisposeMemory();
- DoClose((WindowPeek)&FileData);
- DoClose((WindowPeek)&VolumeData);
- notQuiting = FALSE;
- }
-
- /* ----- Activate Event ------------------------------------------------ */
-
- static void DoActivate (
- register WindowDataPtr w,
- register short active)
- {
- SetPort(w);
- DrawGrowIcon(w);
- DrawSelection(w);
- active = active ? 0 : 255;
- if (w->vs)
- HiliteControl(w->vs, active);
- if (w->hs)
- HiliteControl(w->hs, active);
- }
-
- /* ----- Handle menu command ------------------------------------------- */
-
- static void DoMenuBar (
- long info,
- short modifiers)
- {
- register theMenu = (info >> 16) & 0xFF;
- register theItem = info & 0xFF;
- register short i;
- Str255 daName;
- GrafPtr temp;
- long grow;
- pascal long MaxMem();
-
- switch (theMenu) {
- case AppleMenu:
- if (theItem == aAbout)
- DoAbout(modifiers, MaxMem(&grow));
- else {
- GetItem(AppleM, theItem, &daName);
- GetPort(&temp);
- OpenDeskAcc(&daName);
- SetPort(&temp);
- }
- break;
- case FileMenu:
- switch (theItem) {
- case fNew:
- if (SaveBefore()) {
- FileData.count = VolumeData.count =
- InfoSize = InfoCount = 0L;
- VolumeData.select = FileData.select = -1L;
- Update();
- ClearSorted(&FileData);
- ClearSorted(&VolumeData);
- Dirty = FALSE;
- VrefNum = 0;
- FileData.vrefnum = VolumeData.vrefnum = 0;
- }
- break;
- case fOpen:
- DoOpen();
- break;
- case fClose:
- DoClose1(FrontWindow());
- break;
- case fSave:
- DoSave(FALSE);
- break;
- case fSaveAs:
- DoSave(TRUE);
- break;
- case fSaveText:
- DoSaveText((WindowDataPtr)FrontWindow());
- break;
- case fWindow:
- RestoreWindow(&VolumeData);
- RestoreWindow(&FileData);
- break;
- case fOptions:
- DoOptions(modifiers);
- break;
- case fQuit:
- if (SaveBefore()) {
- DoQuit();
- SetWatch();
- }
- break;
- }
- break;
- case EditMenu:
- switch (theItem) {
- case eUndo:
- case eCut:
- case ePaste:
- SystemEdit(theItem-1);
- break;
- case eCopy:
- if (!SystemEdit(theItem-1))
- CopySelection((WindowDataPtr)FrontWindow());
- break;
- case eClear:
- if (!SystemEdit(theItem-1))
- NoSort();
- break;
- case eFind:
- Find();
- break;
- case eAgain:
- Again();
- break;
- case eSelection:
- Selection();
- break;
- }
- break;
- case FSortMenu:
- DoSort(&FileData, theItem);
- break;
- case VSortMenu:
- DoSort(&VolumeData, theItem);
- break;
- case VolumeMenu:
- switch (theItem) {
- case vAuto:
- CheckItem(VolumeM, vAuto, Automatic = !Automatic);
- break;
- case vAdd:
- AddVolumes();
- break;
- case vDelete:
- DeleteVolume();
- break;
- case vRename:
- RenameVolume();
- break;
- }
- break;
- }
- HiliteMenu(0);
- }
-
- /* ----- Key press event ----------------------------------------------- */
-
- static void DoKeyDowns (register EventRecord *myEvent)
- {
- register unsigned char ch;
- register WindowDataPtr w = (WindowDataPtr)FrontWindow();
- register Boolean option;
-
- ch = myEvent->message & charCodeMask;
- if (myEvent->modifiers & cmdKey) {
- UpdateMenus(myEvent->modifiers);
- DoMenuBar(MenuKey(ch), myEvent->modifiers);
- return;
- }
- switch (ch) {
- case 0x05: /* Help */
- DoMenuBar((unsigned long)AppleMenu << 16 | aAbout,
- myEvent->modifiers);
- return;
- case 0x10: /* Function key */
- switch ((unsigned char)(myEvent->message >> 8)) {
- case 0x7A: /* F1: undo */
- DoMenuBar((unsigned long)EditMenu << 16 | eUndo,
- myEvent->modifiers);
- break;
- case 0x78: /* F2: cut */
- DoMenuBar((unsigned long)EditMenu << 16 | eCut,
- myEvent->modifiers);
- break;
- case 0x63: /* F3: copy */
- DoMenuBar((unsigned long)EditMenu << 16 | eCopy,
- myEvent->modifiers);
- break;
- case 0x76: /* F4: paste */
- DoMenuBar((unsigned long)EditMenu << 16 | ePaste,
- myEvent->modifiers);
- break;
- }
- return;
- }
-
- if (w != &VolumeData && w != &FileData) /* Not our problem */
- return;
- option = (myEvent->modifiers & optionKey) != 0;
- switch (ch) {
- case 0x03: /* Enter, return */
- case 0x0D:
- if (w->select != -1)
- Selection();
- break;
- case 0x01: /* Home */
- MoveToLine(w, 0);
- break;
- case 0x04: /* End */
- MoveToLine(w, w->count - 1);
- break;
- case 0x0B: /* Page up */
- KeyScroll(w, TRUE, inPageUp);
- break;
- case 0x0C: /* Page down */
- KeyScroll(w, TRUE, inPageDown);
- break;
- case 0x1C: /* Cursor left */
- KeyScroll(w, FALSE, option ? inPageUp : inUpButton);
- break;
- case 0x1D: /* Cursor right */
- KeyScroll(w, FALSE, option ? inPageDown : inDownButton);
- break;
- case 0x1E: /* Cursor up */
- KeyScroll(w, TRUE, option ? inPageUp : inUpButton);
- break;
- case 0x1F: /* Cursor down */
- KeyScroll(w, TRUE, option ? inPageDown : inDownButton);
- break;
- }
- }
-
- /* ----- Handle mouse event -------------------------------------------- */
-
- static void DoMouse (register EventRecord *myEvent)
- {
- register Point global;
- register short where;
- WindowPtr w;
-
- global = myEvent->where;
- where = FindWindow(global, &w);
- switch (where) {
- case inDesk:
- SysBeep(1);
- break;
- case inMenuBar:
- UpdateMenus(myEvent->modifiers);
- DoMenuBar(MenuSelect(global), myEvent->modifiers);
- break;
- case inSysWindow:
- SystemClick(myEvent, w);
- break;
- case inContent:
- DoContent(myEvent, w);
- break;
- case inDrag:
- DragWindow(w, global, &Bounds);
- break;
- case inGrow:
- DoGrow(w, global);
- break;
- case inGoAway:
- if (TrackGoAway(w, global))
- DoClose1(w);
- break;
- case inZoomIn:
- case inZoomOut:
- if (TrackBox(w, global, where))
- DoZoom(w, where);
- }
- }
-
- /* ----- Update event -------------------------------------------------- */
-
- static void DoUpdates (register EventRecord *myEvent)
- {
- register WindowPtr w;
- register WindowDataHdl h;
-
- w = (WindowPtr)(myEvent->message);
- SetPort(w);
- BeginUpdate(w);
- EraseRect(&w->portRect);
- RedrawV((WindowDataPtr)w, TRUE) /*RedrawH(w, TRUE)*/;
- DrawGrowIcon(w);
- DrawControls(w);
- EndUpdate(w);
- }
-
- /* ----- Main event loop ----------------------------------------------- */
-
- static short Event (void)
- {
- EventRecord event;
- register Boolean doit;
- register short active;
- register WindowPeek w;
-
- if (WNE)
- doit = WaitNextEvent(everyEvent, &event, 300, 0L);
- else {
- SystemTask();
- doit = GetNextEvent(everyEvent, &event);
- }
- if (doit) {
- InitCursor();
- switch (event.what) {
- case mouseDown:
- DoMouse(&event);
- break;
- case autoKey:
- case keyDown:
- DoKeyDowns(&event);
- break;
- case updateEvt:
- DoUpdates(&event);
- break;
- case diskEvt:
- if (Automatic)
- DoDisk(event.message);
- break;
- case activateEvt:
- active = event.modifiers & activeFlag;
- DoActivate((WindowDataPtr)event.message, active);
- break;
- case app4Evt: /* MultiFinder event */
- if ((w = (WindowPeek)FrontWindow()) &&
- (w->windowKind == userKind))
- DoActivate((WindowDataPtr)w,
- (Boolean)(event.message & 1));
- }
- }
- return notQuiting;
- }
-
- /* ----- Main program -------------------------------------------------- */
-
- void main (void)
- {
- MaxApplZone();
- Init();
- while (Event())
- ;
- }
-